package cn.tedu.csmall520.business.service.impl;

import cn.tedu.csmall520.business.service.IBusinessService;
import cn.tedu.csmall520.commons.pojo.order.dto.OrderAddDTO;
import cn.tedu.csmall520.order.service.IOrderService;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;

@Service
@Slf4j
//business模块是单纯的消费者，不需要在类上添加@DubboService注解来表示供应者
public class BusinessServiceImpl implements IBusinessService {

    //Dubbo调用订单模块，实现订单新增
    @DubboReference
    private IOrderService dubboOrderService;

    @Override
//    Global：全局     Transactional：事务   添加了此注解，就相当于设置了分布式事务的起点，等效于AT模型中的TM(事务管理器)
//    从这个方法开始，远程调用的每个方法，对数据库的操作，在同一个事务中，都有原子性的特性
//    任何一个分支方法发生异常，所有对数据库的操作都会回滚
    @GlobalTransactional
    public void buy() {
        // 实例化一个订单业务的DTO对象
        OrderAddDTO orderAddDTO = new OrderAddDTO();
        orderAddDTO.setUserId("UU100");
        orderAddDTO.setCommodityCode("PC100");
        orderAddDTO.setCount(5);
        orderAddDTO.setMoney(100);
        log.info("新增的订单信息为：{}",orderAddDTO);
        //调用order模块，完成订单新增的业务
        dubboOrderService.addNew(orderAddDTO);
    }

}
